using System;
using System.Collections;
using System.Data;
using System.Data.SqlClient;
using SystemFrameworks;
using Microsoft.ApplicationBlocks.Data;
using Common; using MinCultura.Sipa.DataAccess.EntidadesArtes;
using SystemFrameworks;

namespace MinCultura.Sipa.EntidadesArtes
{
	/// <summary>
	/// Clase de acceso a datos para la entidad ART_ENTIDAD_ACTIVIDAD
	/// </summary>
	public class EntidadActividad 
	{
		#region Private Data Access Atributes

		private const String ENT_ID_PARAM = "@ENT_ID";
		private const String TEA_ID_PARAM = "@TEA_ID";
		private const String ACE_ID_PARAM = "@ACE_ID";
		private const String ENT_ACTIVIDAD_PRINCIPAL_PARAM = "@ENT_ACTIVIDAD_PRINCIPAL";
		private const String ENT_AREA_ARTISTICA_PARAM = "@ENT_AREA_ARTISTICA";
		private const String ENT_NRO_OBRAS_NUEVAS_PARAM = "@ENT_NRO_OBRAS_NUEVAS";
		private const String ENT_SINO_FORMACION_PUBLICO_PARAM = "@ENT_SINO_FORMACION_PUBLICO";
		private const String ENT_PROMEDIO_MENSUAL_PERSONAS_PARAM = "@ENT_PROMEDIO_MENSUAL_PERSONAS";
		private const String ENT_SINO_NOADULTOS_PARAM = "@ENT_SINO_NOADULTOS";
		private const String ENT_SINO_ETNICAS_PARAM = "@ENT_SINO_ETNICAS";
		private const String ENT_SINO_DISCAPACITADOS_PARAM = "@ENT_SINO_DISCAPACITADOS";
		private const String ENT_OTRA_MINORIA_ETNICA_PARAM = "@ENT_OTRA_MINORIA_ETNICA";

		#endregion Private Data Access Atributes

		/// <summary>
		/// Constructor de la clase ARTENTIDADACTIVIDAD
		/// </summary>
        public EntidadActividad(string strCadenaConecxion)
        {
            ConnectionString = strCadenaConecxion;
        }

        private string _cadenaConexion;

        public string ConnectionString
        {
            get { return _cadenaConexion; }
            set { _cadenaConexion = value; }
        }

		public EntidadActividadData BuscarEntidadActividad()
		{
			EntidadActividadData response = new EntidadActividadData();
			SqlHelper.ExecuteDataTable(this.ConnectionString, CommandType.StoredProcedure, "PAS_BUSCAR_ART_ENTIDAD_ACTIVIDAD", response);
			if (response.Rows.Count == 0)
				return null;
			return response;
		}


		public EntidadActividadData ConsultarEntidadActividad(decimal parENT_ID)
		{
			EntidadActividadData response = new EntidadActividadData();

			SqlParameter param1 = new SqlParameter(ENT_ID_PARAM, parENT_ID);

			SqlParameter[] parameters = {param1};
			SqlHelper.ExecuteDataTable(this.ConnectionString, CommandType.StoredProcedure, "PAS_CONSULTAR_ART_ENTIDAD_ACTIVIDAD", response, parameters);
			if (response.Rows.Count == 0)
				return null;
			return response;
		}

		public void AdicionarEntidadActividad(EntidadActividadData datos, params SqlTransaction[] transaccion)
		{			
			try
			{
				foreach (DataRow row in datos.Rows)
				{
					SqlParameter param1 = new SqlParameter(ENT_ID_PARAM, row[EntidadActividadData.ENT_ID_FIELD]);					
					SqlParameter param2 = new SqlParameter(ENT_AREA_ARTISTICA_PARAM, row[EntidadActividadData.ENT_AREA_ARTISTICA_FIELD]);
					SqlParameter param3 = new SqlParameter(ENT_NRO_OBRAS_NUEVAS_PARAM, row[EntidadActividadData.ENT_NRO_OBRAS_NUEVAS_FIELD]);
					SqlParameter param4 = new SqlParameter(ENT_SINO_FORMACION_PUBLICO_PARAM, row[EntidadActividadData.ENT_SINO_FORMACION_PUBLICO_FIELD]);
					SqlParameter param5 = new SqlParameter(ENT_PROMEDIO_MENSUAL_PERSONAS_PARAM, row[EntidadActividadData.ENT_PROMEDIO_MENSUAL_PERSONAS_FIELD]);
					SqlParameter param6 = new SqlParameter(ENT_SINO_NOADULTOS_PARAM, row[EntidadActividadData.ENT_SINO_NOADULTOS_FIELD]);
					SqlParameter param7 = new SqlParameter(ENT_SINO_ETNICAS_PARAM, row[EntidadActividadData.ENT_SINO_ETNICAS_FIELD]);
					SqlParameter param8 = new SqlParameter(ENT_SINO_DISCAPACITADOS_PARAM, row[EntidadActividadData.ENT_SINO_DISCAPACITADOS_FIELD]);
					SqlParameter param9 = new SqlParameter(ENT_OTRA_MINORIA_ETNICA_PARAM, row[EntidadActividadData.ENT_OTRA_MINORIA_ETNICA_FIELD]);
					SqlParameter param10 = new SqlParameter(TEA_ID_PARAM, row[EntidadActividadData.TEA_ID_FIELD]);
					SqlParameter param11 = new SqlParameter(ACE_ID_PARAM, row[EntidadActividadData.ACE_ID_FIELD]);
					
					SqlParameter[] parameters = {param1, param2, param3, param4, param5, param6, param7, param8, param9, param10,param11};

					if (transaccion.Length == 0)
						SqlHelper.ExecuteNonQuery(this.ConnectionString, CommandType.StoredProcedure, "PAS_ADICIONAR_ART_ENTIDAD_ACTIVIDAD", parameters);
					else
						SqlHelper.ExecuteNonQuery(transaccion[0], CommandType.StoredProcedure, "PAS_ADICIONAR_ART_ENTIDAD_ACTIVIDAD", parameters);
				}
			}
			catch (SqlException sqlEx)
			{
				throw new ApplicationExceptionManager(Utilidad.DisplaySqlErrors(sqlEx, "PAS_ADICIONAR_ART_ENTIDAD_ACTIVIDAD"), sqlEx);
			}
			catch (Exception ex)
			{
				throw new ApplicationExceptionManager(Utilidad.TraerMensaje("gmsgErrorInsertar", "PAS_ADICIONAR_ART_ENTIDAD_ACTIVIDAD"), ex);
			}
		}

		/// <summary>
		/// Adiciona un registro en la tabla ART_ENTIDAD_ACTIVIDAD
		/// </summary>
		/// <param name="datos"></param>
		/// <param name="objDataAccesoEntidad"></param>
		/// <param name="objDataMinoriaEntidad"></param>
		/// <param name="objDataPoblacionEntidad"></param>
		/// <param name="objDataGrupoEdadEntidad"></param>
		/// <param name="objDataOtrosCamposEntidad"></param>
		/// <param name="transaccion"></param>
		public void AdicionarEntidadActividad(EntidadActividadData datos, 
			AccesoEntidadData objDataAccesoEntidad, 
			MinoriasEtnicasEntidadData objDataMinoriaEntidad, 
			PoblacionEntidadData objDataPoblacionEntidad, 
			GrupoEdadEntidadData objDataGrupoEdadEntidad, 			
			params SqlTransaction[] transaccion)
		{

            AccesoEntidad objAccesoEntidad = new AccesoEntidad(ConnectionString);
            MinoriasEtnicasEntidad objMinoriasEtnicasEntidad = new MinoriasEtnicasEntidad(ConnectionString);
            GrupoEdadEntidad objGrupoEdadEntidad = new GrupoEdadEntidad(ConnectionString);
            PoblacionEntidad objPoblacionEntidad = new PoblacionEntidad(ConnectionString);			
			
			try
			{
				if (transaccion.Length > 0)
				{
					AdicionarEntidadActividad(datos,transaccion[0]);
					objAccesoEntidad.AdicionarAccesoEntidad(objDataAccesoEntidad, transaccion[0]);
					objMinoriasEtnicasEntidad.AdicionarMinoriasEtnicasEntidad(objDataMinoriaEntidad, transaccion[0]);
					objPoblacionEntidad.AdicionarPoblacionEntidad(objDataPoblacionEntidad, transaccion[0]);
					objGrupoEdadEntidad.AdicionarGrupoEdadEntidad(objDataGrupoEdadEntidad, transaccion[0]);					
				}
				else
				{
					AdicionarEntidadActividad(datos,transaccion);
					objAccesoEntidad.AdicionarAccesoEntidad(objDataAccesoEntidad);
					objMinoriasEtnicasEntidad.AdicionarMinoriasEtnicasEntidad(objDataMinoriaEntidad);
					objPoblacionEntidad.AdicionarPoblacionEntidad(objDataPoblacionEntidad);
					objGrupoEdadEntidad.AdicionarGrupoEdadEntidad(objDataGrupoEdadEntidad);					
				}
			}
			catch (SqlException sqlEx)
			{				
				throw new ApplicationExceptionManager(Utilidad.DisplaySqlErrors(sqlEx, "AdicionarEntidadActividad"), sqlEx);
			}
			catch (Exception ex)
			{				
				throw new ApplicationExceptionManager(Utilidad.TraerMensaje("gmsgErrorInsertar", "AdicionarEntidadActividad"), ex);
			}
		}

		public void ActualizarEntidadActividad(EntidadActividadData datos, params SqlTransaction[] transaccion)
		{
			try
			{
				foreach (DataRow row in datos.Rows)
				{
					SqlParameter param1 = new SqlParameter(ENT_ID_PARAM, row[EntidadActividadData.ENT_ID_FIELD]);					
					SqlParameter param2 = new SqlParameter(ENT_AREA_ARTISTICA_PARAM, row[EntidadActividadData.ENT_AREA_ARTISTICA_FIELD]);
					SqlParameter param3 = new SqlParameter(ENT_NRO_OBRAS_NUEVAS_PARAM, row[EntidadActividadData.ENT_NRO_OBRAS_NUEVAS_FIELD]);
					SqlParameter param4 = new SqlParameter(ENT_SINO_FORMACION_PUBLICO_PARAM, row[EntidadActividadData.ENT_SINO_FORMACION_PUBLICO_FIELD]);
					SqlParameter param5 = new SqlParameter(ENT_PROMEDIO_MENSUAL_PERSONAS_PARAM, row[EntidadActividadData.ENT_PROMEDIO_MENSUAL_PERSONAS_FIELD]);
					SqlParameter param6 = new SqlParameter(ENT_SINO_NOADULTOS_PARAM, row[EntidadActividadData.ENT_SINO_NOADULTOS_FIELD]);
					SqlParameter param7 = new SqlParameter(ENT_SINO_ETNICAS_PARAM, row[EntidadActividadData.ENT_SINO_ETNICAS_FIELD]);
					SqlParameter param8 = new SqlParameter(ENT_SINO_DISCAPACITADOS_PARAM, row[EntidadActividadData.ENT_SINO_DISCAPACITADOS_FIELD]);
					SqlParameter param9 = new SqlParameter(ENT_OTRA_MINORIA_ETNICA_PARAM, row[EntidadActividadData.ENT_OTRA_MINORIA_ETNICA_FIELD]);
					SqlParameter param10 = new SqlParameter(TEA_ID_PARAM, row[EntidadActividadData.TEA_ID_FIELD]);
					SqlParameter param11 = new SqlParameter(ACE_ID_PARAM, row[EntidadActividadData.ACE_ID_FIELD]);
					
					SqlParameter[] parameters = {param1, param2, param3, param4, param5, param6, param7, param8, param9, param10,param11};
					if (transaccion.Length == 0)
						SqlHelper.ExecuteNonQuery(this.ConnectionString, CommandType.StoredProcedure, "PAS_ACTUALIZAR_ART_ENTIDAD_ACTIVIDAD", parameters);
					else
						SqlHelper.ExecuteNonQuery(transaccion[0], CommandType.StoredProcedure, "PAS_ACTUALIZAR_ART_ENTIDAD_ACTIVIDAD", parameters);
				}
			}
			catch (SqlException sqlEx)
			{
				throw new ApplicationExceptionManager(Utilidad.DisplaySqlErrors(sqlEx, "PAS_ACTUALIZAR_ART_ENTIDAD_ACTIVIDAD o PAS_ACTUALIZAR_ART_ENTIDAD_ACTIVIDAD"), sqlEx);
			}
			catch (Exception ex)
			{
				throw new ApplicationExceptionManager(Utilidad.TraerMensaje("gmsgErrorActualizar", "PAS_ACTUALIZAR_ART_ENTIDAD_ACTIVIDAD o PAS_ACTUALIZAR_ART_ENTIDAD_ACTIVIDAD"), ex);
			}
		}

		public void ActualizarEntidadActividad(EntidadActividadData datos, 
			AccesoEntidadData objDataAccesoEntidad, 
			MinoriasEtnicasEntidadData objDataMinoriaEntidad, 
			PoblacionEntidadData objDataPoblacionEntidad, 
			GrupoEdadEntidadData objDataGrupoEdadEntidad,
			params SqlTransaction[] transaccion)
		{
			decimal idEntidad = Convert.ToDecimal(datos.Rows[0][EntidadActividadData.ENT_ID_FIELD]);
            AccesoEntidad objAccesoEntidad = new AccesoEntidad(ConnectionString);
            MinoriasEtnicasEntidad objMinoriasEtnicasEntidad = new MinoriasEtnicasEntidad(ConnectionString);
            PoblacionEntidad objPoblacionEntidad = new PoblacionEntidad(ConnectionString);
            GrupoEdadEntidad objGrupoEdadEntidad = new GrupoEdadEntidad(ConnectionString);
					
			try
			{
				if (transaccion.Length >0)
				{
					ActualizarEntidadActividad(datos,transaccion);

					objAccesoEntidad.EliminarAccesoEntidad(idEntidad,transaccion[0]);
					objAccesoEntidad.AdicionarAccesoEntidad(objDataAccesoEntidad, transaccion[0]);

					objMinoriasEtnicasEntidad.EliminarMinoriasEtnicasEntidad(idEntidad,transaccion[0]);	
					objMinoriasEtnicasEntidad.AdicionarMinoriasEtnicasEntidad(objDataMinoriaEntidad, transaccion[0]);

					objPoblacionEntidad.EliminarPoblacionEntidad(idEntidad,transaccion[0]);
					objPoblacionEntidad.AdicionarPoblacionEntidad(objDataPoblacionEntidad, transaccion[0]);

					objGrupoEdadEntidad.EliminarGrupoEdadEntidad(idEntidad,transaccion[0]);
					objGrupoEdadEntidad.AdicionarGrupoEdadEntidad(objDataGrupoEdadEntidad, transaccion[0]);
				}
				else
				{
					ActualizarEntidadActividad(datos);

					objAccesoEntidad.EliminarAccesoEntidad(idEntidad);
					objAccesoEntidad.AdicionarAccesoEntidad(objDataAccesoEntidad);

					objMinoriasEtnicasEntidad.EliminarMinoriasEtnicasEntidad(idEntidad);	
					objMinoriasEtnicasEntidad.AdicionarMinoriasEtnicasEntidad(objDataMinoriaEntidad);

					objPoblacionEntidad.EliminarPoblacionEntidad(idEntidad);
					objPoblacionEntidad.AdicionarPoblacionEntidad(objDataPoblacionEntidad);

					objGrupoEdadEntidad.EliminarGrupoEdadEntidad(idEntidad);
					objGrupoEdadEntidad.AdicionarGrupoEdadEntidad(objDataGrupoEdadEntidad);
				}
			}
			catch (SqlException sqlEx)
			{		
				throw new ApplicationExceptionManager(Utilidad.DisplaySqlErrors(sqlEx, "ActualizarEntidadActividad"), sqlEx);
			}
			catch (Exception ex)
			{			
				throw new ApplicationExceptionManager(Utilidad.TraerMensaje("gmsgErrorActualizar", "ActualizarEntidadActividad"), ex);
			}
		}

		/// <summary>
		/// Elimina un registro de la entidad Artentidadactividad
		/// </summary>
		/// <param name="parENT_ID">Identificador del registro
		public void EliminarEntidadActividad(decimal parENT_ID)
		{
			try
			{
				SqlParameter param1 = new SqlParameter(ENT_ID_PARAM, parENT_ID);

				SqlParameter[] parameters = {param1};
				SqlHelper.ExecuteNonQuery(this.ConnectionString, CommandType.StoredProcedure, "PAS_ELIMINAR_ART_ENTIDAD_ACTIVIDAD", parameters);
			}
			catch (SqlException sqlEx)
			{
				throw new ApplicationExceptionManager(Utilidad.DisplaySqlErrors(sqlEx, "PAS_ELIMINAR_ART_ENTIDAD_ACTIVIDAD"), sqlEx);
			}
			catch (Exception ex)
			{
				throw new ApplicationExceptionManager(Utilidad.TraerMensaje("gmsgErrorEliminar", "PAS_ELIMINAR_ART_ENTIDAD_ACTIVIDAD"), ex);
			}
		}

		public void EliminarEntidadActividad(ArrayList arrIDs)
		{
			SqlConnection objConnection = new SqlConnection(ConnectionString);
			objConnection.Open();
			SqlTransaction objTrans = objConnection.BeginTransaction();

			try
			{
				foreach (object Item in arrIDs)
				{
					SqlParameter param1 = new SqlParameter(ENT_ID_PARAM, decimal.Parse(Item.ToString()));
					SqlParameter[] parameters = {param1};
					SqlHelper.ExecuteNonQuery(objTrans, CommandType.StoredProcedure, "PAS_ELIMINAR_ART_ENTIDAD_ACTIVIDAD", parameters);
				}
				objTrans.Commit();
			}
			catch (SqlException sqlEx)
			{
				objTrans.Rollback();
				throw new ApplicationExceptionManager(Utilidad.DisplaySqlErrors(sqlEx, "PAS_ELIMINAR_ART_ENTIDAD_ACTIVIDAD"), sqlEx);
			}
			catch (Exception ex)
			{
				objTrans.Rollback();
				throw new ApplicationExceptionManager(Utilidad.TraerMensaje("gmsgErrorEliminar", "PAS_ELIMINAR_ART_ENTIDAD_ACTIVIDAD"), ex);
			}
			finally
			{
				objConnection.Close();
			}
		}


	}
}